package com.aaa.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.Verification;

import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * token工具类
 */
public class JWTUtils {

    //声明密钥
    private static String secret = "qy160-niu";

    /**
     * 通过jwt生成token令牌
     */
    public static String getToken(Map<String,Object> map){
        //声明一个map当做头部标签
        Map<String,Object> head=new HashMap<>();
        head.put("alg","HS256");
        head.put("typ","JWT");

        //使用时间工具(Calendar)获取过期时间
        Calendar calendar=Calendar.getInstance();  //获取当前时间
        calendar.set(Calendar.SECOND,7200);        //在这个时间点加上7200秒
        Date expire = calendar.getTime();          //获取时间增加后的时间点(也就是我们要使用的过期时间)

        //组装token的三部分
        String token = JWT.create()
                .withHeader(head)         //头部标签
                .withIssuedAt(new Date()) //官方的载荷内容：签发时间
                .withExpiresAt(expire)    //官方的载荷内容：过期时间
                .withSubject("测试玩玩")    //官方的载荷内容：主题
                .withClaim("map", map)  //定义自己的载荷内容
                .sign(Algorithm.HMAC256(secret));     //定义签名
        return token;
    }

    /**
     * 检验token是否正确
     * @param token
     */
    public static boolean validateToken(String token){
        try { // 如果根据密钥检验token没有错误，就返回true，否则返回false
            //获取签名(密钥)
            Verification require = JWT.require(Algorithm.HMAC256(secret));
            //检验token
            DecodedJWT verify = require.build().verify(token);
            return true;
        }catch (Exception e){
            //打印异常信息
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 获取token中指定的数据
     */
    public static Map<String,Object> getInfo(String token){
        Verification require = JWT.require(Algorithm.HMAC256("qy160-niu"));
        DecodedJWT verify = require.build().verify(token);
        String token1 = verify.getToken();    //获取的是token值
        String payload = verify.getPayload(); //获取token中的载荷部分值
        String header = verify.getHeader();   //获取token中的头部标签值
        String signature = verify.getSignature(); // 获取token中的签名标签值
        Map<String, Object> map = verify.getClaim("map").asMap(); //获取原始载荷中的内容并转换为map类型的数据
        return map;
    }
}
